﻿
using System;

class clA
{
    public string nom;

    public clA()
    {
        nom = "inconnu";
    }
    public clA(string nom)
    {
        this.nom = nom;
    }
    public virtual string methode1(string s)// methode1virtuelle : redéfinissable
    {
        return s + " ** ";
    }
}

class clB : clA
{
    public string prenom = "......";

    public clB()
    {
        // constructeur vide car appel implicite à base( )
    }

    public clB(string nom, string prenom)
        : base(nom)
    {
        // constructeur appel explicte à base( string s)
        this.prenom = prenom;
    }
    public new string methode1(string s)// redéfini methode1 de classe mère
    //    public override string methode1(string s)// redéfini methode1 de classe mère
    { // appel à méthode1 de la classe mère par base
        return " >> " + base.methode1(s);
    }
}

class Exercice
{
    public static void Main(string[] args) // méthode principale de lancement de l'exécution
    {
        clA a =new clA("tata");       
        Console.WriteLine("a.nom = {0}", a.nom);
        Console.WriteLine("a.methode1('////////') = {0}", a.methode1("////////"));
     
        clB x = new clB();
        Console.WriteLine("x.nom = {0} ,  x.prenom = {1}", x.nom, x.prenom);

        x = new clB("Lavarède", "cinqSous");
        Console.WriteLine("x.nom = {0} ,  x.prenom = {1}", x.nom, x.prenom);
        Console.WriteLine("x.methode1('test') = " + x.methode1("test"));

        // polymorphisme d'objet y déclaré en clA puis instancié en clB :
        clA y = new clB("Martin", "jean");
        Console.WriteLine("y.methode1('test') = " + y.methode1("test"));
        Console.WriteLine("y.nom = {0} ", y.nom); //le prenom n'est pas accessible car y est déclaré en clA

        // transtypage de l'objet y en type clB (permet l'acès au prénom):
        clB z = (clB)y;
        Console.WriteLine("z.nom = {0} ,  z.prenom = {1}", z.nom, z.prenom);

        Console.ReadLine();
    }
}